<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"
    />
    <title>代理模式</title>
    <style lang="css">
        .preload {
            display: block;
            width: 160px;
            height: 160px;
        }
    </style>
</head>

<body>
    <h2>用高阶函数动态创建代理</h2>
    <h3>在 JavaScript开发中最常用的是虚拟代理和缓存代理</h2>
    <p>例子：各种计算方式</p>
    <p>其他代理方式 防火墙代理：控制网络资源的访问，保护主题不让“坏人”接近。</p>
    <p> 远程代理：为一个对象在不同的地址空间提供局部代表，在 Java 中，远程代理可以是另 一个虚拟机中的对象。</p>
    <p> 保护代理：用于对象应该有不同访问权限的情况。</p>
    <p> 智能引用代理：取代了简单的指针，它在访问对象时执行一些附加操作，比如计算一个 对象被引用的次数。</p>
    <p> 写时复制代理：通常用于复制一个庞大对象的情况。写时复制代理延迟了复制的过程， 当对象被真正修改时，才对它进行复制操作。写时复制代理是虚拟代理的一种变体，DLL
    （操作系统中的动态链接库）是其典型运用场景。</p>

    <script type="text/javascript">
        /**************** 计算乘积 *****************/
        var mult = function () {
            var a = 1;
            for (var i = 0, l = arguments.length; i < l; i++) {
                a = a * arguments[i];
            }
            return a;
        };
        /**************** 计算加和 *****************/
        var plus = function () {
            var a = 0;
            for (var i = 0, l = arguments.length; i < l; i++) {
                a = a + arguments[i];
            }
            return a;
        };
        /**************** 创建缓存代理的工厂 *****************/
        var createProxyFactory = function (fn) {
            var caches = {}
            return function () {
                var args = Array.prototype.join.call(arguments, ',')
                if (args in caches) {
                    return caches[args]
                }
                caches[args] = fn.apply(this, arguments)
                return caches[args]
            }

        }
        // 一共计算了3次
        var proxyMult = createProxyFactory(mult)
        var proxyPlus = createProxyFactory(plus)

        var test1 = proxyMult(2, 3)
        var test2 = proxyMult(2, 3, 4)
        var test3 = proxyMult(2, 3, 4)

        var test4 = proxyPlus(2, 3, 4, 5)
        var test5 = proxyPlus(2, 3, 4, 5)
        var test6 = proxyPlus(2, 3, 4, 5,6)

        console.log(test1)
        console.log(test2)
        console.log(test3)
        console.log(test4)
        console.log(test5)
        console.log(test6)

    </script>

</body>

</html>